/**
 * @file           : serial_data.cpp
 * @author         : fwy
 * @brief          :
 * @email          : 2643660853@qq.com
 * @date           : 23-1-18 上午1:06
 */

#include "serial_data.h"
using namespace std;

TransferData SerialData::read()
{
    // init
    if (!__is_init)
    {
        // 初始化接收数据
        TransferData transfer_data;
        transfer_data.rotation.yaw = 0;
        transfer_data.data_f =
            {
                0,    // 云台手的目标点x坐标
                0,    // 云台手的目标点y坐标
                420,  // 当前比赛剩余时间
                700,  // 己方哨兵的血量
                1500, // 己方前哨站的血量
                0,    // 发弹量
            };
        transfer_data.data_u8 =
            {
                1U, // 开关跟随模式标志位，0表示开启，1表示关闭
                1U, // 颜色，0表示己方为蓝，1表示敌方为红
                0U, // 目标地点，目的在于方便云台手让哨兵一键到达目的地，0表示资源岛，1表示上坡巡逻，必须要让此时模式为路径规划模式
                0U, // 模式切换标志位，0表示路径规划模式，1表示跟随模式，2表示射击模式
                0U, // 云台相机是否有目标
                0U, // 是否开启建图
            };
        __last_data = transfer_data;
        __is_init = true;
    }
    // 接收数据
    vector<ReceiveData> receive_datas = __serial_port.readStruct<ReceiveData>(0x44, 0x55);
    // 判空
    if (!receive_datas.empty())
    {
        __receive_data = receive_datas.back();
        // 整合得到传递数据
        TransferData transfer_data;
        transfer_data.rotation.yaw = __receive_data.yaw;
        transfer_data.data_f = {
            __receive_data.goalx,
            __receive_data.goaly,
            __receive_data.time,
            __receive_data.hp_sentry,
            __receive_data.hp_outpost,
            __receive_data.total_emission};
        transfer_data.data_u8 = {
            __receive_data.tracker_bit,
            __receive_data.color,
            __receive_data.target_destination,
            __receive_data.change_mode,
            __receive_data.target_mode,
            __receive_data.is_mapping};
        // 错误数据判断
        // if ((transfer_data.data_u8[0] != 0U && transfer_data.data_u8[0] != 1U) || (transfer_data.data_u8[1] != 0U && transfer_data.data_u8[1] != 1U))
        // {
        //     return __last_data;
        // }
        // 更新信息数据
        __last_data = transfer_data;
    }
    return __last_data;
}

void SerialData::write(const TransferData &transfer_data)
{
    static uint8_t end_flag = 0;
    // 数据准备
    uint8_t is_grab = transfer_data.data_u8[0];
    // 整合得到发送数据
    __send_data = {is_grab, end_flag};
    // 写入串口
    __serial_port.writeStruct<SendData>(__send_data);
}

// TODO
bool SerialData::isOpened()
{
    if (__serial_port.isOpened())
        return true;
    else
        return false;
}
